package com.sigetdriver.view.popup;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.TimeZone;

import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.sigetdriver.R;
import com.sigetdriver.ServerConstants;
import com.sigetdriver.ServicioWorkingSet;
import com.sigetdriver.controller.ServicioController;
import com.sigetdriver.entities.PuntoBean;
import com.sigetdriver.entities.ServicioBean;
import com.sigetdriver.util.ConnectionDetector;
import com.sigetdriver.util.SigetDriverUtil;
import com.sigetdriver.view.activity.VoucherActivity;

public class GuardarVoucherCreditoPopup {
	private ProgressDialog proDialogo;
	private Context context;
	public Dialog dialog;
	private EditText edtCodigo;
	private Button btnGrabar;
	public static boolean flagEnvioVerificado = true;

	public void dialog(Context _context, final String codigo) {

		context = _context;
		dialog = new Dialog(_context);
		dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
		dialog.setContentView(R.layout.popup_codigo);
		dialog.setCancelable(false);
		dialog.getWindow().setLayout(LayoutParams.FILL_PARENT,
				LayoutParams.WRAP_CONTENT);

		edtCodigo = (EditText) dialog.findViewById(R.id.edtCodigo);

		btnGrabar = (Button) dialog.findViewById(R.id.btnGrabar);
		btnGrabar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				ConnectionDetector dt = new ConnectionDetector(context);
				
				
				if(!dt.isConnectingToInternet()){
					Toast.makeText(context, "Debe tener acceso a Internet.", Toast.LENGTH_SHORT).show();
				}else if (!dt.isDataInternetActive()) {
					Toast.makeText(context, "Se ha agotado su plan de datos.", Toast.LENGTH_SHORT).show();
				}else{

					if (edtCodigo.getText().toString().equals(codigo)) {
						
						new enviarVoucher().execute();
						ServicioController.getInstance().actualizarServicio(
								ServicioWorkingSet.servicio);
						dialog.dismiss();
						
					} else if(edtCodigo.getText().toString().equals("99999")){
						
						flagEnvioVerificado = false;
						new enviarVoucher().execute();
						ServicioController.getInstance().actualizarServicio(
								ServicioWorkingSet.servicio);
						dialog.dismiss();
						
					}else{
						Toast.makeText(context, "Codigo de voucher incorrecto",
								Toast.LENGTH_SHORT).show();
					}
					
				}
				
				
			}
			
		});
		dialog.show();

	}
	
	protected void showDialogo() {
		proDialogo = new ProgressDialog(context);
		proDialogo.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		proDialogo.setTitle("Envio de voucher");
		proDialogo.setMessage("Enviando...");
		proDialogo.setCancelable(false);
		proDialogo.show();
	}


	// ENVIAR VOUCHER
	class enviarVoucher extends AsyncTask<Void, Void, Boolean> {
		String respuesta = "";
		/*
		 * (non-Javadoc)
		 * 
		 * @see android.os.AsyncTask#onPreExecute()
		 */
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			showDialogo();
		}

		@Override
		protected Boolean doInBackground(Void... params) {
			boolean bResult = false;

			String URL = ServerConstants.SERVER_IP + "/ordenServicio/";

			System.out.println("---URL---\n" + URL);
			

			ArrayList<PuntoBean> puntos = ServicioWorkingSet.servicio
					.getPuntos();

			try {
				JSONObject jsonPadre = new JSONObject();
				JSONObject jsonHijo = new JSONObject();

				double totalEstacionamiento = 0;
				double totalOtros = 0;
				double totalPeaje = 0;
				double totalTarifa = 0;
				double totalTiempoEspera = 0;
				double totalServicio = 0;

				for (int i = 0; i < puntos.size(); i++) {
					PuntoBean punto = puntos.get(i);
					totalEstacionamiento += Double.parseDouble(punto
							.getGastoEstacionamiento());
					totalOtros += Double.parseDouble(punto.getGastoOtros());
					totalPeaje += Double.parseDouble(punto.getGastoPeaje());
					totalTiempoEspera += Double.parseDouble(punto
							.getGastoTiempoEspera());

					if (i != 0) {
						totalTarifa += Double.parseDouble(punto.getTarifa());
					}

				}

				totalServicio = totalEstacionamiento + totalOtros + totalPeaje
						+ totalTiempoEspera + totalTarifa;

				jsonPadre.accumulate("numReserva", Integer
						.valueOf(ServicioWorkingSet.servicio.getIdServicio()));
				jsonPadre.accumulate("origenDireccion", puntos.get(0)
						.getDireccion());
				jsonPadre.accumulate("origenLatitud",
						Double.parseDouble(puntos.get(0).getLatitudLlegada()));
				jsonPadre.accumulate("origenLongitud",
						Double.parseDouble(puntos.get(0).getLongitudLlegada()));

		

				jsonPadre.accumulate("observacion",
						ServicioWorkingSet.servicio.getObservaciones());
				if (ServicioWorkingSet.servicio.getTipoPago().equals(
						ServicioBean.TIPO_PAGO_CONTADO)) {
					jsonPadre.accumulate("tipoPago", "Contado");
				} else if (ServicioWorkingSet.servicio.getTipoPago().equals(
						ServicioBean.TIPO_PAGO_CREDITO)) {
					jsonPadre.accumulate("tipoPago", "Credito");
				}

				jsonPadre.accumulate("totalEstacionamiento",
						totalEstacionamiento);
				jsonPadre.accumulate("totalOtros", totalOtros);
				jsonPadre.accumulate("totalPeaje", totalPeaje);
				jsonPadre.accumulate("totalTiempoEspera", totalTiempoEspera);
				jsonPadre.accumulate("totalTarifa", totalTarifa);
				jsonPadre.accumulate("totalServicio", totalServicio);
				
				
				/*Add*/
				SimpleDateFormat sdf1 = new SimpleDateFormat("HH:mm");
				sdf1.setTimeZone(TimeZone.getTimeZone("America/Bogota"));
				String  horaInicioOrigen = puntos.get(0).getHoraIr();
				String  horaLLegadaOrigen = puntos.get(0).getHoraLlegada();
				
				Date date3 = sdf1.parse(horaInicioOrigen);
				Date date4 = sdf1.parse(horaLLegadaOrigen);
				
				long lHoraInicioOrigen = date3.getTime();
				long lHoraLLegadaOrigen = date4.getTime();
				
				jsonPadre.accumulate("horaInicioOrigen", lHoraInicioOrigen);
				jsonPadre.accumulate("horaLlegadaOrigen", lHoraLLegadaOrigen);
				jsonPadre.accumulate("flagEnvioVerificado", flagEnvioVerificado);
				

				// DESTINOS
				JSONArray jsonArrayHijo = new JSONArray();
				JSONObject jsonNieto = new JSONObject();

				for (int i = 1; i < puntos.size(); i++) {

					jsonHijo = new JSONObject();
					jsonHijo.accumulate("puntoDireccion", puntos.get(i)
							.getDireccion());
					jsonHijo.accumulate("puntoLatitud", Double
							.parseDouble(puntos.get(i).getLatitudLlegada()));
					jsonHijo.accumulate("puntoLongitud", Double
							.parseDouble(puntos.get(i).getLongitudLlegada()));

					Log.e("JSON HIJO",
							Double.parseDouble(puntos.get(i)
									.getLatitudLlegada())
									+ " - "
									+ Double.parseDouble(puntos.get(i)
											.getLongitudLlegada()));
//
//					SimpleDateFormat sdf1 = new SimpleDateFormat("HH:mm");
//					sdf1.setTimeZone(TimeZone.getTimeZone("America/Bogota"));

//					SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm");
//					sdf2.setTimeZone(TimeZone.getTimeZone("America/Bogota"));

					String sHoraInicio = puntos.get(i).getHoraIr();
					String sHoraLlegada = puntos.get(i).getHoraLlegada();

					Date date1 = sdf1.parse(sHoraInicio);
					Date date2 = sdf1.parse(sHoraLlegada);

					System.out.println("in milliseconds: " + date1.getTime());

					// Time t1 = Time.;
					// Time t2 = Time.valueOf(puntos.get(i).getHoraLlegada());
					long lHoraInicio = date1.getTime();
					long lHoraLlegada = date2.getTime();

					jsonHijo.accumulate("horaLlegadaDestino", lHoraInicio);
					jsonHijo.accumulate("horaInicioDestino", lHoraLlegada);

					//
					// try {
					// jsonHijo.accumulate("horaInicioDestino",
					// Integer.parseInt(puntos.get(i).getHoraIr()));
					// } catch (Exception e) {
					// jsonHijo.accumulate("horaInicioDestino", null);
					// }
					//
					// try {
					// jsonHijo.accumulate("horaLlegadaDestino",
					// Integer.parseInt(puntos.get(i).getHoraLlegada()));
					// } catch (Exception e) {
					// jsonHijo.accumulate("horaLlegadaDestino", null);
					// }

					jsonHijo.accumulate("peaje",
							Double.parseDouble(puntos.get(i).getGastoPeaje()));
					jsonHijo.accumulate("estacionamiento", Double
							.parseDouble(puntos.get(i)
									.getGastoEstacionamiento()));
					jsonHijo.accumulate("otros",
							Double.parseDouble(puntos.get(i).getGastoOtros()));
					jsonHijo.accumulate("tarifa",
							Double.parseDouble(puntos.get(i).getTarifa()));
					jsonArrayHijo.put(jsonHijo);
				}

				jsonPadre.accumulate("destinos", jsonArrayHijo);

				System.out.println("---JSON A ENVIAR---\n" + jsonPadre);

				respuesta = SigetDriverUtil.makeHttpRequest(URL, "POST",
						jsonPadre).toString();

				JSONObject estado = new JSONObject(respuesta);
				int iEstado = estado.getInt("estado");

				if (iEstado == 1) {
					bResult = true;
				}

			} catch (Exception e) {
				bResult = false;
				e.printStackTrace();
			}

			System.out.println("---RESPUESTA---\n" + respuesta);

			return bResult;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
		 */

		@Override
		protected void onPostExecute(Boolean result) {
			super.onPostExecute(result);
			proDialogo.dismiss();
			ServicioWorkingSet.iTiemEspera = 0;
			ServicioWorkingSet.esIniciadoTE = false;

			if (result) {
				Toast.makeText(context,
						"Voucher guardado correctamente", Toast.LENGTH_SHORT)
						.show();
				ServicioController.getInstance().actualizarServicio(
						ServicioWorkingSet.servicio);
				ServicioWorkingSet.bIsFinish = false;
				((VoucherActivity) context).finish();
			} else {

				if (respuesta.equals("Error")) {
					Toast.makeText(
							context,
							"Tiempo de espera agotado. "
							+ "Verifique su paquete de datos de internet o consulte a la central.",
							Toast.LENGTH_SHORT).show();
				}else{
					Toast.makeText(
							context,
							"Hubo un error al enviar el voucher, vuelva a intentarlo.",
							Toast.LENGTH_SHORT).show();
				}
				
			}

		}

	}

}
